/**
 *  递归调用本质就是函数调用
 *  利用链表的天然递归解决去除链表重复元素的操作
 *  1, 2, 6, 3, 4, 5, 6
 *  想成一个头节点指向一个更小的链表
 *  如： 1-> 2 6 3 4 5 6         此时2是更小的链表的头节点
 *
 *  这个更小的链表经过判断会去除重复元素(递归)
 *
 *  然后看头节点.val 是否==要求的val
 *  如果相等把更小的链表返回
 *  如果不相等把头节点变成更小的链表的头节点
 *
 *  递归的原理:把大问题看成一个更小的子问题，
 *  然后程序逻辑就是运行到最小的子问题(问题的结束点)，然后慢慢回调回来，解决实际问题
 *
 *  解决更小规模的问题后结合当前问题的解，组织逻辑后就可以解决实际问题
 *  可以画图理解
 */
public class Solution3 {
    public ListNode removeElements(ListNode head, int val) {

        if(head==null)
            return null;

        //res是不包含head节点的已经去出了重复元素的链表
        ListNode res = removeElements(head.next,val);
        if(head.val==val){
            return res;
        }
        else{
            head.next=res;
            return head;
        }
    }


    //测试自己的Solution3类
    public static void main(String[] args) {

        int[] nums = {1, 2, 6, 3, 4, 5, 6};
        ListNode head = new ListNode(nums);
        System.out.println(head);

        ListNode res = (new Solution3()).removeElements(head, 6);
        System.out.println(res);
    }


}